package com.dufang.singletonMode;

/**
 * @ClassName:singleton
 * @Description 单例模式->懒汉模式
 * 好处：懒汉模式中单例是在需要的时候才去创建的，如果单例已经创建，再次调用获取接口将不会重新创建新的对象，而是直接返回之前创建的对象。
 * 缺点：但是这里的懒汉模式并没有考虑线程安全问题，在多个线程可能会并发调用它的getInstance()方法，导致创建多个实例，
 * 适用于：如果某个单例使用的次数少，并且创建单例消耗的资源较多，那么就需要实现单例的按需创建，这个时候使用懒汉模式就是一个不错的选择。
 *
 * 以上代码在单线程下运行是没有问题的，但要运行在多线程下，就会出现实例化多个类对象的情况。这是怎么回事呢？
 * 当线程 A 进入到 if 判断条件后，开始实例化对象，此时 instance 依然为 null；又有线程 B 进入到 if 判断条件中，
 * 之后也会通过条件判断，进入到方法里面创建一个实例对象。
 *
 * @Author Administrator
 * @Date 2025/7/7/007 8:46
 * @Version 1.0
 **/
public class Singleton02 {
    //初始不实例化
    private static Singleton02 instance = null;//不实例化

    private Singleton02() {
        System.out.println(Thread.currentThread().getName()+"线程懒汉。。。。");
    }//构造函数

    public static Singleton02 getInstance() {//函数像整个系统提供实例
        if (null == instance) {//当instance为null时，则实例化对象，否则直接返回
            instance = new Singleton02();//实例化对象
        }
        return instance;//返回已存在的对象
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                Singleton02.getInstance();
            }).start();

        }
    }
}

